﻿<?php
// ********************************************
// 
// Справочник моделей
//
// ********************************************

require_once( "tools.class.php" );
require_once( "tables.class.php" );
require_once( "datadefine.class.php" );

class ModelDictionary extends tables
{

    public function GetPage()
    {
        
        $data = new jqGridData();
        
        while( true )
        {
            if( $this->db == NULL ) {
                $data->userdata->errcode = 1;
                $data->userdata->errmess = "Ошибка соединения с базой данных.";
                break;
            }
            $db = $this->db;
        
// Проверяем данные
            $page	= ( isset($_REQUEST["page"]) && $_REQUEST["page"] > 0 ) ? $_REQUEST["page"] : 1;
            $limit	= ( isset($_REQUEST["rows"]) && $_REQUEST["rows"] > 0 ) ? $_REQUEST["rows"] : 1;
            $sidx	= ( isset($_REQUEST["sidx"]) && $_REQUEST["sidx"] != '' ) ? $_REQUEST["sidx"] : 'model_id';
            $sord	= ( isset($_REQUEST["sord"]) && strtolower($_REQUEST["sord"]) == 'desc' ) ? 'DESC' : 'ASC';
            $search	= ( isset($_REQUEST["_search"]) && strtolower($_REQUEST["_search"]) == 'true') ? true : false;
    
// Фильтр
            $whc = array();
 
            $vend_id = isset($_REQUEST["vend_id"]) ? $_REQUEST["vend_id"] : '';
            if( $vend_id === '' ) {
                break;              // Производитель пока не указан
            }
            if( !is_numeric($vend_id) ) {
                $data->userdata->errcode = 1;
                $data->userdata->errmess = "Нарушение формата данных.";
                break;
            }
            else {
                $whc[] = "a.vend_id=" . $db->quote($vend_id);
            }
            
            if( $search )
            {
                if(isset($_REQUEST["model_id"]) && is_numeric($_REQUEST["model_id"])) {
    				$whc[] = "a.model_id=" . $db->quote($_REQUEST["model_id"]);
    			}
    
                if(isset($_REQUEST["model_name"]) && $_REQUEST["model_name"] != "") {
    				$whc[] = "a.model_name LIKE " . $db->quote("%".$_REQUEST["model_name"]."%");
                }
            }
            $whereclaus = (count($whc) != 0 ) ? " WHERE " . implode(" AND ", $whc) : "";
    		unset($whc);
    
// Получаем количество записей с учетом фильтра
            $sqlreq = "SELECT COUNT(*) as count FROM models AS a" . $whereclaus;
            $recset = $db->query( $sqlreq );
        	$row = $recset->fetch(PDO::FETCH_ASSOC);
    		$count = $row['count'];
    		$recset->closeCursor();
    
    // Пустая таблица
            if ($count == 0) break;
    
    // Рассчитаем сколько всего страниц займут данные в БД
    		if( $count > 0 && $limit > 0) {
    			$total_pages = ceil($count/$limit);
    		} else {
    			$total_pages = 0;
    		}                  
     
    // Если по каким-то причинам клиент запросил
    		if ($page > $total_pages) $page=$total_pages;                  
     
    // Рассчитываем стартовое значение для LIMIT запроса
    		$start = $limit*$page - $limit;                  
     
    // Зашита от отрицательного значения
    		if($start < 0) $start = 0;                  
     
    // Формируем запрос
            $sidx = ( $sidx == "vend_id" ) ?  "b.vend_name" : "a.".$sidx;
            
    		$sqlreq = 
            "SELECT a.model_id AS model_id, b.vend_name AS vend_name, a.model_name AS model_name ".
            "FROM models AS a LEFT OUTER JOIN vendors AS b ON b.vend_id = a.vend_id ".
            $whereclaus." ORDER BY ".$sidx." ".$sord." LIMIT ".$start.", ".$limit;
    
    		$recset = $db->query($sqlreq);                  
     
    // Формирование объекта для возврата
    		$data->page      = $page;
    		$data->total     = $total_pages;
    		$data->records   = $count;
    		
    // Строки данных для таблицы
    		$i = 0;
    		while($row = $recset->fetch(PDO::FETCH_ASSOC)) {
    			$data->rows[$i]['id'] = $row['model_id'];
    			$data->rows[$i]['cell'] = array(
    					$row['model_id'],
                        $row['vend_name'],
                        $row['model_name']
    			);
    			$i++;
    		}
            break;
    	}	
// Отдаем результат
   		header("Content-type: text/script;charset=utf-8");
		echo json_encode($data);
		return;
    }

//
// Добавление новой модели
//
    public function Insert()
    {
        $vend_id    = isset($_REQUEST["vend_id"]) ? $_REQUEST["vend_id"] : '';
        $model_id	= isset($_REQUEST["id"]) ? $_REQUEST["id"] : '';
        $model_name	= isset($_REQUEST["model_name"]) ? $_REQUEST["model_name"] : '';
		
		$errmess = "";

        while(true)
        {
			if ($model_id != "_empty" || !is_numeric($vend_id) || $model_name == "") {
				$errmess = "Нарушение формата данных";
				break;
			}

            if( $this->db == NULL ) {
                $errmess = "Ошибка соединения с базой данных.";
                break;
            }
            $db = $this->db;
            
            // Проверяем существование
            $sqlreq = 
                "SELECT COUNT(*) as count FROM models WHERE vend_id=".$db->quote($vend_id).
                " AND model_name = ".$db->quote($model_name);
                
			$recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $count = $row['count'];
            $recset->closeCursor();
            if ($count > 0) {
                $errmess = "В справочнике уже присутствует модель данного <br>".
                            "производителя с аналогичным названием";
                break;
            }
            
            $sqlreq = "INSERT INTO models (vend_id, model_name) VALUES ( ".
                $db->quote($vend_id).", ".$db->quote($model_name)." )";

			if( $db->exec($sqlreq) === false ){
                $errmess = "Ошибка добавления новой записи.";
				break;
			}
			
            break;
        }

        Tools::json_response( $errmess, $errmess ? 1 : 0 );            
        return;
    }

//
// Изменение в записи модели
//
    public function Update()
    {
        $vend_id     = isset($_REQUEST["vend_id"]) ? $_REQUEST["vend_id"] : '';
        $model_id    = isset($_REQUEST["id"]) ? $_REQUEST["id"] : '';
        $model_name  = isset($_REQUEST["model_name"]) ? $_REQUEST["model_name"] : '';
        
        $errmess = "";

        while(true)
        {
			if (!is_numeric($model_id) || !is_numeric($vend_id) || $model_name == "") {
				$errmess = "Нарушение формата данных";
				break;
			}

            if( $this->db == NULL ) {
                $errmess = "Ошибка соединения с базой данных.";
                break;
            }
            $db = $this->db;
        
            // Проверяем сеществование
            $sqlreq = 
                "SELECT COUNT(*) AS count FROM models WHERE model_name = ".$db->quote($model_name).
                " AND vend_id = ".$db->quote($vend_id).
                " AND model_id != " . $db->quote($model_id);

            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $count = $row['count'];
            $recset->closeCursor();
            if ($count > 0) {
                $errmess = "В справочнике уже присутствует модель данного <br>".
                            "производителя с аналогичным названием.";
                break;
            }

            $sqlreq = "UPDATE models SET ".
                "model_name=".$db->quote($model_name)." ". 
                "WHERE model_id=".$db->quote($model_id);

            if( $db->exec($sqlreq) === false ){
                $errmess = "Ошибка обновления записи.";
                break;
            }

            break;
        }

        Tools::json_response( $errmess, $errmess ? 1 : 0 );            
        return;
    }

//
// Удалить список моделей
//
    public function Delete()
    {
        $errmess = "";
        $model_ids = (isset($_REQUEST['id']) && $_REQUEST['id'] != '') ?
            explode(",", $_REQUEST["id"], 100) : array();

        while( true ) {
            if (!Tools::is_numeric_array( $model_ids )) {
                $errmess = "Ошибка удаления записи.";
                break;
            }

            $model_id_list = implode(',', $model_ids);
            
            if( $this->db == NULL ) {
                $errmess = "Ошибка соединения с базой данных.";
                break;
            }
            $db = $this->db;
            
            $sqlreq = "SELECT COUNT(*) as count FROM cars WHERE model_id IN (".$model_id_list.")";
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $count = $row['count'];
            $recset->closeCursor();
            if ($count > 0) {
                $errmess = "Одна или несколько моделей уже задействованы. Поэтому их удаление невозможно.";
                break;
            }

            $sqlreq = 
               "START TRANSACTION;".
               "DELETE FROM price WHERE car_id IN ( SELECT car_id FROM cars ".
                    "WHERE model_id IN (".$model_id_list.") );".
               "DELETE FROM cars WHERE model_id IN (".$model_id_list.");".
               "DELETE FROM models WHERE model_id IN (".$model_id_list.");";
               
            if( $db->exec($sqlreq) === false ){
                $db->exec("ROLLBACK;");
                $errmess = "Ошибка удаления записи(сей).";
                break;
            }
            else {
                $db->exec("COMMIT;");
            }

            break;
        }

        Tools::json_response( $errmess, $errmess ? 1 : 0 );            
        return;
    }

//
// Найти список по подстроке в имени
//    
    public function Find()
    {
        $errmess = "";
        $term = isset($_REQUEST["term"]) ? $_REQUEST["term"] : '';
        $vend_id = isset($_REQUEST["vend_id"]) ? $_REQUEST["vend_id"] : '';

        $data = array();

        while( true ) {
// Проверяем данные
            if ( $term == "" || !is_numeric($vend_id)) {
                $errmess = "Нарушение формата данных";
                break;
            }

            if( $this->db == NULL ) {
                $errmess = "Ошибка соединения с базой данных.";
                break;
            }
            $db = $this->db;
        
// Формируем запрос
            $sqlreq = 
                "SELECT * FROM models WHERE vend_id=".$db->quote($vend_id).
                " AND model_name LIKE ".$db->quote("%".$term."%")." ORDER BY model_name";
                
            $recset = $db->query( $sqlreq );
            while( $row = $recset->fetch(PDO::FETCH_ASSOC) ) {
                $unit = new AutoCompleteItem();
                $unit->value = $row['model_id'];
                $unit->name = $row['model_name'];
                $data[] = $unit;
            }
            $recset->closeCursor();
            break;
        }

        Tools::json_response( $errmess, $errmess ? 1 : 0, $data );            
        return;
    }

    
    public function GetList()
    {
        $vend_id = isset($_REQUEST['node_id']) ? $_REQUEST['node_id'] : '';
        $errmess = "";
        $node = array();
        
        while( true ) {
            if( !is_numeric($vend_id)) {
                $errmess = "Нарушение формата данных";
                break;
            }

            if( $this->db == NULL ) {
                $errmess = "Ошибка соединения с базой данных.";
                break;
            }
            $db = $this->db;

// Получаем количество записей с учетом фильтра
            $recset = $db->query( "SELECT COUNT(*) as count FROM models WHERE vend_id=".$db->quote($vend_id) );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $count = $row['count'];
            $recset->closeCursor();

// Пустая таблица
            if ($count == 0) break; 

// Формируем запрос
            $sqlreq = "SELECT * FROM models WHERE vend_id=".$db->quote($vend_id)." ORDER BY model_name";

            $recset = $db->query($sqlreq);                  
 
// Строки данных для таблицы
            while($row = $recset->fetch(PDO::FETCH_ASSOC)) {
                $unit = new DynaTreeNode();
                $unit->key = $vend_id.".".$row['model_id'];
                $unit->title = $row['model_name'];
                $unit->isFolder = false;
                $unit->isLazy = false;
                $node[] = $unit;
            }
            $recset->closeCursor();

            break;
        }
        
        header("Content-type: text/script; charset=utf-8");
        echo json_encode($node);

        return;
    }
    
} //End of class ModelDictionary
?>